#!/bin/sh /etc/rc.common
#
# Copyright 2011 Iordan Iordanov <iiordanov (AT) gmail.com>
#
#    This file is part of luci-pbx.
#
#    luci-pbx is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    luci-pbx is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with luci-pbx.  If not, see <http://www.gnu.org/licenses/>.

. /etc/functions.sh

START=60

# Some global variables
MODULENAME=pbx
USERAGENT="PBX"
DEFAULTOUTCNTXT=default-outgoing-call-context
HANGUPCNTXT=hangup
GTALKUNVL=unavailable

ASTUSER=nobody
ASTGROUP=nogroup
ASTDIRSRECURSIVE="/var/run/asterisk /var/log/asterisk /var/spool/asterisk"
ASTDIRS="/usr/lib/asterisk"

FIREWALL_PATH="/etc/asterisk/firewall.$MODULENAME"

TEMPLATEDIR=/etc/${MODULENAME}-asterisk
ASTERISKDIR=/etc/asterisk
WORKDIR=/tmp/$MODULENAME.$$
MD5SUMSFILE=/tmp/$MODULENAME-sums.$$

TMPL_ASTERISK=$TEMPLATEDIR/asterisk.conf.TEMPLATE
TMPL_GTALK=$TEMPLATEDIR/gtalk.conf.TEMPLATE
TMPL_INDICATIONS=$TEMPLATEDIR/indications.conf.TEMPLATE
TMPL_LOGGER=$TEMPLATEDIR/logger.conf.TEMPLATE
TMPL_MANAGER=$TEMPLATEDIR/manager.conf.TEMPLATE
TMPL_MODULES=$TEMPLATEDIR/modules.conf.TEMPLATE
TMPL_RTP=$TEMPLATEDIR/rtp.conf.TEMPLATE

TMPL_EXTCTHRUCHECKHDR=$TEMPLATEDIR/extensions_disa-check_header.conf.TEMPLATE
TMPL_EXTCTHRUCHECK=$TEMPLATEDIR/extensions_disa-check.conf.TEMPLATE
TMPL_EXTCTHRUCHECKFTR=$TEMPLATEDIR/extensions_disa-check_footer.conf.TEMPLATE
TMPL_EXTCTHRUHDR=$TEMPLATEDIR/extensions_disa_header.conf.TEMPLATE
TMPL_EXTCTHRU=$TEMPLATEDIR/extensions_disa.conf.TEMPLATE

TMPL_EXTENSIONS=$TEMPLATEDIR/extensions.conf.TEMPLATE

TMPL_EXTBLKLIST=$TEMPLATEDIR/extensions_blacklist.conf.TEMPLATE
TMPL_EXTBLKLISTFTR=$TEMPLATEDIR/extensions_blacklist_footer.conf.TEMPLATE
TMPL_EXTBLKLISTHDR=$TEMPLATEDIR/extensions_blacklist_header.conf.TEMPLATE

TMPL_EXTINCNTXTSIP=$TEMPLATEDIR/extensions_incoming_context_sip.conf.TEMPLATE
TMPL_EXTINCNTXTGTALKHDR=$TEMPLATEDIR/extensions_incoming_context_gtalk_header.conf.TEMPLATE
TMPL_EXTINCNTXTGTALK=$TEMPLATEDIR/extensions_incoming_context_gtalk.conf.TEMPLATE

TMPL_EXTUSERCNTXT=$TEMPLATEDIR/extensions_user_context.conf.TEMPLATE
TMPL_EXTUSERCNTXTFTR=$TEMPLATEDIR/extensions_user_context_footer.conf.TEMPLATE
TMPL_EXTUSERCNTXTHDR=$TEMPLATEDIR/extensions_user_context_header.conf.TEMPLATE

TMPL_EXTOUTHDR=$TEMPLATEDIR/extensions_default_outgoing_header.conf.TEMPLATE
TMPL_EXTOUTGTALK=$TEMPLATEDIR/extensions_outgoing_gtalk.conf.TEMPLATE
TMPL_EXTOUTLOCAL=$TEMPLATEDIR/extensions_outgoing_dial_local_user.conf.TEMPLATE
TMPL_EXTOUTSIP=$TEMPLATEDIR/extensions_outgoing_sip.conf.TEMPLATE

TMPL_FIREWALL=$TEMPLATEDIR/firewall.$MODULENAME.TEMPLATE
TMPL_JABBER=$TEMPLATEDIR/jabber.conf.TEMPLATE
TMPL_JABBERUSER=$TEMPLATEDIR/jabber_users.conf.TEMPLATE
TMPL_SIP=$TEMPLATEDIR/sip.conf.TEMPLATE
TMPL_SIPPEER=$TEMPLATEDIR/sip_peer.TEMPLATE
TMPL_SIPREG=$TEMPLATEDIR/sip_registration.TEMPLATE
TMPL_SIPUSR=$TEMPLATEDIR/sip_user.TEMPLATE

INCLUDED_FILES="$WORKDIR/extensions_blacklist.conf $WORKDIR/extensions_callthrough.conf\
                $WORKDIR/extensions_incoming.conf  $WORKDIR/extensions_incoming_gtalk.conf\
                $WORKDIR/extensions_user.conf      $WORKDIR/jabber_users.conf\
                $WORKDIR/sip_peers.conf            $WORKDIR/sip_registrations.conf\
                $WORKDIR/sip_users.conf"


# In this string, we concatenate all local users enabled to receive calls
# readily formatted for the Dial command.
localusers_to_ring=""
# In this string, we keep a list of all users that are enabled for outgoing
# calls. It is used at the end to create the user contexts.
localusers_can_dial=""

# In this string, we put together a space-separated list of provider names
# (alphanumeric, with all non-alpha characters replaced with underscores),
# which will be used to dial out by default (whose outgoing contexts will
# be included in users' contexts by default.
outbound_providers=""

# Copies the template files which we don't edit.
copy_unedited_templates_over()
{
	cp $TMPL_ASTERISK    $WORKDIR/asterisk.conf
	cp $TMPL_GTALK       $WORKDIR/gtalk.conf
	cp $TMPL_INDICATIONS $WORKDIR/indications.conf
        cp $TMPL_LOGGER      $WORKDIR/logger.conf
	cp $TMPL_MANAGER     $WORKDIR/manager.conf
	cp $TMPL_MODULES     $WORKDIR/modules.conf
}

# Touches all the included files, to prevent asterisk from refusing to
# start if a config item is missing and an included config file isn't created.
create_included_files()
{
    touch $INCLUDED_FILES
}

# Puts together all the extensions.conf related configuration.
pbx_create_extensions_config()
{
	sed "s/|LOCALUSERS|/$localusers_to_ring/g" $TMPL_EXTENSIONS > $WORKDIR/extensions.conf
	mv  $WORKDIR/inext.TMP                         $WORKDIR/extensions_incoming.conf
	cp  $TMPL_EXTINCNTXTGTALKHDR                   $WORKDIR/extensions_incoming_gtalk.conf
	cat $WORKDIR/outextgtalk.TMP                >> $WORKDIR/extensions_incoming_gtalk.conf 2>/dev/null
	rm -f $WORKDIR/outextgtalk.TMP
	mv  $WORKDIR/blacklist.TMP                     $WORKDIR/extensions_blacklist.conf
	mv  $WORKDIR/userext.TMP                       $WORKDIR/extensions_user.conf
	cp  $TMPL_EXTCTHRUHDR                          $WORKDIR/extensions_callthrough.conf
	cat $WORKDIR/callthrough.TMP                >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	rm -f $WORKDIR/callthrough.TMP
	cat $TMPL_EXTCTHRUCHECKHDR                  >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	cat $WORKDIR/callthroughcheck.TMP           >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	rm -f $WORKDIR/callthroughcheck.TMP
	cat $TMPL_EXTCTHRUCHECKFTR                  >> $WORKDIR/extensions_callthrough.conf 2>/dev/null
	rm -f $WORKDIR/outext-*.TMP
	rm -f $WORKDIR/localext.TMP
}

# Puts together all the sip.conf related configuration.
pbx_create_sip_config()
{
	mv $WORKDIR/sip_regs.TMP    $WORKDIR/sip_registrations.conf
	mv $WORKDIR/sip_peers.TMP   $WORKDIR/sip_peers.conf
	mv $WORKDIR/sip_users.TMP   $WORKDIR/sip_users.conf
}

# Creates the jabber.conf related config
pbx_create_jabber_config()
{
	cp  $TMPL_JABBER        $WORKDIR/jabber.conf
	mv  $WORKDIR/jabber.TMP $WORKDIR/jabber_users.conf
}

# Gets rid of any config files from $ASTERISKDIR not found in $WORKDIR.
clean_up_asterisk_config_dir()
{
        for f in $ASTERISKDIR/* ; do
                basef="`basename $f`"
                if [ ! -e "$WORKDIR/$basef" ] ; then
                        rm -rf "$f"
                fi
        done
}

# Compares md5sums of the config files in $WORKDIR to those
# in $ASTERISKDIR, and copies only changed files over to reduce
# wear on flash in embedded devices.
compare_configs_and_copy_changed()
{
	# First, compute md5sums of the config files in $WORKDIR.
	cd $WORKDIR/
	md5sum * > $MD5SUMSFILE

	# Now, check the files in $ASTERISKDIR against the md5sums.
	cd $ASTERISKDIR/
	changed_files="`md5sum -c $MD5SUMSFILE 2>/dev/null | fgrep ": FAILED" | awk -F: '{print $1}'`"

	rm -f $MD5SUMSFILE

	[ -z "$changed_files" ] && return

	# Now copy over the changed files.
	for f in $changed_files ; do
		cp "$WORKDIR/$f" "$ASTERISKDIR/$f"
	done
}

# Calls the functions that create the final config files
# Calls the function which compares which files have changed
# Puts the final touches on $ASTERISKDIR
# Gets rid of $WORKDIR
pbx_assemble_and_copy_config()
{
	mkdir -p $ASTERISKDIR

	copy_unedited_templates_over
	create_included_files
	pbx_create_extensions_config
	pbx_create_sip_config
	pbx_create_jabber_config

	touch    $WORKDIR/features.conf

	# At this point, $WORKDIR should contain a complete, working config.
	clean_up_asterisk_config_dir

	compare_configs_and_copy_changed

	[ ! -d $ASTERISKDIR/manager.d ] && mkdir -p $ASTERISKDIR/manager.d/

	# Get rid of the working directory
	rm -rf $WORKDIR/
}

# Creates configuration for a user and adds it to the temporary file that holds
# all users configured so far.
pbx_add_user()
{
	local fullname
	local defaultuser
	local secret
	local ring
	local can_call

	config_get fullname $1 fullname
	config_get defaultuser $1 defaultuser
	config_get secret $1 secret
	config_get ring $1 ring
	config_get can_call $1 can_call

	[ -z "$defaultuser" -o -z "$secret" ] && return
	[ -z "$fullname" ] && fullname="$defaultuser"

	sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPUSR > $WORKDIR/sip_user.tmp

	if [ "$can_call" = "yes" ] ; then
		# Add user to list of all users that are allowed to make calls.
		localusers_can_dial="$localusers_can_dial $defaultuser"
		sed -i "s/|CONTEXTNAME|/$defaultuser/g"     $WORKDIR/sip_user.tmp
	else
		sed -i "s/|CONTEXTNAME|/$HANGUPCNTXT/g"     $WORKDIR/sip_user.tmp
	fi

	# Add this user's configuration to the temp file containing all user configs.
	sed "s/|FULLNAME|/$fullname/" $WORKDIR/sip_user.tmp |\
	     sed "s/|SECRET|/$secret/g"                  >> $WORKDIR/sip_users.TMP

	if [ "$ring" = "yes" ] ; then
		if [ -z "$localusers_to_ring" ] ; then
			localusers_to_ring="SIP\/$defaultuser"
		else
			localusers_to_ring="$localusers_to_ring\&SIP\/$defaultuser"
		fi
	fi

	# Add configuration which allows local users to call each other.
	sed "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_EXTOUTLOCAL >> $WORKDIR/localext.TMP

	rm -f $WORKDIR/sip_user.tmp
}

# Creates configuration for a Google account, and adds it to the temporary file that holds
# all accounts configured so far.
# Also creates the outgoing extensions which are used in users' outgoing contexts.
pbx_add_jabber()
{
	local username
	local secret
	local numprefix
	local register
	local make_outgoing_calls
	local name
	local users_to_ring
	local status
	local statusmessage

	config_get username $1 username
	config_get secret $1 secret
	config_get numprefix $1 numprefix
	config_get register $1 register
	config_get make_outgoing_calls $1 make_outgoing_calls
	config_get name $1 name
	config_get status $1 status
	config_get statusmessage $1 statusmessage

	[ -z "$username" -o -z "$secret" ] && return

	# Construct a jabber entry for this provider.
	sed     "s/|USERNAME|/$username/g" $TMPL_JABBERUSER |\
	    sed "s/|NAME|/$name/g"                            > $WORKDIR/jabber.tmp

	if [ "$register" = yes ] ; then
		# If this provider is enabled for incoming calls, we need to set the
		# status of the user to something other than unavailable in order to receive calls.
		sed -i "s/|STATUS|/$status/g"                   $WORKDIR/jabber.tmp
		sed -i "s/|STATUSMESSAGE|/\"$statusmessage\"/g" $WORKDIR/jabber.tmp

		users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
		# If no users have been specified to ring, we ring all users enabled for incoming calls.
		if [ -z "$users_to_ring" ] ; then
			users_to_ring=$localusers_to_ring
		else
		# Else, we cook up a string formatted for the Dial command
		# with the specified users (SIP/user1&SIP/user2&...). We do it
		# with set, shift and a loop in order to be more tolerant of ugly whitespace
		# messes entered by users.
			set $users_to_ring
			users_to_ring="SIP\/$1" && shift
			for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
		fi

		# Now, we add this account to the gtalk incoming context.
		sed    "s/|USERNAME|/$username/g" $TMPL_EXTINCNTXTGTALK |\
		   sed "s/|LOCALUSERS|/$users_to_ring/g"    >> $WORKDIR/outextgtalk.TMP
	else
		sed -i "s/|STATUS|/$GTALKUNVL/g"               $WORKDIR/jabber.tmp
		sed -i "s/|STATUSMESSAGE|/\"\"/g"              $WORKDIR/jabber.tmp
	fi

	# Add this account's configuration to the temp file containing all account configs.
	sed "s/|SECRET|/$secret/g" $WORKDIR/jabber.tmp      >> $WORKDIR/jabber.TMP

	# If this provider is enabled for outgoing calls.
	if [ "$make_outgoing_calls" = "yes" ] ; then

		numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"

		# If no prefixes are specified, then we use "X" which matches any prefix.
		[ -z "$numprefix" ]  && numprefix="X"

		for p in $numprefix ; do
			sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTGTALK |\
			    sed "s/|NAME|/$name/g"            >> $WORKDIR/outext-$name.TMP
		done

		# Add this provider to the list of enabled outbound providers.
		if [ -z "$outbound_providers" ] ; then
			outbound_providers="$name"
		else
			outbound_providers="$outbound_providers $name"
		fi
	fi

	rm -f $WORKDIR/jabber.tmp
}

# Creates configuration for a SIP provider account, and adds it to the temporary file that holds
# all accounts configured so far.
# Also creates the outgoing extensions which are used in users' outgoing contexts.
pbx_add_peer()
{
	local defaultuser
	local secret
	local host
	local fromdomain
	local register
	local numprefix
	local make_outgoing_calls
	local name
	local users_to_ring
	local port
	local outboundproxy

	config_get defaultuser $1 defaultuser
	config_get secret $1 secret
	config_get host $1 host
	config_get port $1 port
	config_get outbountproxy $1 outboundproxy
	config_get fromdomain $1 fromdomain
	config_get register $1 register
	config_get numprefix $1 numprefix
	config_get make_outgoing_calls $1 make_outgoing_calls
	config_get name $1 name

	[ -z "$defaultuser" -o -z "$secret" -o -z "$host" ] && return
	[ -z "$fromdomain" ]    && fromdomain=$host
	[ -n "$port" ]          && port="port=$port"
	[ -n "$outboundproxy" ] && outboundproxy="outboundproxy=$outboundproxy"

	# Construct a sip peer entry for this provider.
	sed    "s/|DEFAULTUSER|/$defaultuser/" $TMPL_SIPPEER  >  $WORKDIR/sip_peer.tmp
	sed -i "s/|NAME|/$name/"                                 $WORKDIR/sip_peer.tmp
	sed -i "s/|FROMUSER|/$defaultuser/"                      $WORKDIR/sip_peer.tmp
	sed -i "s/|SECRET|/$secret/"                             $WORKDIR/sip_peer.tmp
	sed -i "s/|HOST|/$host/"                                 $WORKDIR/sip_peer.tmp
	sed -i "s/|PORT|/$port/"                                 $WORKDIR/sip_peer.tmp
	sed -i "s/|OUTBOUNDPROXY|/$outboundproxy/"               $WORKDIR/sip_peer.tmp
	# Add this account's configuration to the temp file containing all account configs.
	sed    "s/|FROMDOMAIN|/$host/" $WORKDIR/sip_peer.tmp >>  $WORKDIR/sip_peers.TMP

	# If this provider is enabled for incoming calls.
        if [ "$register" = "yes" ] ; then
		# Then we create a registration string for this provider.
		sed    "s/|DEFAULTUSER|/$defaultuser/g" $TMPL_SIPREG         > $WORKDIR/sip_reg.tmp
		sed -i "s/|SECRET|/$secret/g"                                  $WORKDIR/sip_reg.tmp
		sed    "s/|NAME|/$name/g" $WORKDIR/sip_reg.tmp              >> $WORKDIR/sip_regs.TMP

		users_to_ring="`uci -q get ${MODULENAME}-calls.incoming_calls.$name`"
		# If no users have been specified to ring, we ring all users enabled for incoming calls.
		if [ -z "$users_to_ring" ] ; then
			users_to_ring=$localusers_to_ring
		else
		# Else, we cook up a string formatted for the Dial command
		# with the specified users (SIP/user1&SIP/user2&...). We do it
		# with set, shift and a loop in order to be more tolerant of ugly whitespace
		# messes entered by users.
			set $users_to_ring
			users_to_ring="SIP\/$1" && shift
			for u in $@ ; do users_to_ring=$users_to_ring\\\&SIP\\\/$u ; done
		fi

		# And we create an incoming calls context for this provider.
		sed    "s/|NAME|/$name/g"                          $TMPL_EXTINCNTXTSIP |\
		    sed "s/|LOCALUSERS|/$users_to_ring/g"       >> $WORKDIR/inext.TMP
	fi

	# If this provider is enabled for outgoing calls.
	if [ "$make_outgoing_calls" = "yes" ] ; then

		numprefix="`uci -q get ${MODULENAME}-calls.outgoing_calls.$name`"
		# If no prefixes are specified, then we use "X" which matches any prefix.
		[ -z "$numprefix" ]  && numprefix="X"
		for p in $numprefix ; do
			sed "s/|NUMPREFIX|/$p/g" $TMPL_EXTOUTSIP |\
			    sed "s/|NAME|/$name/g"              >> $WORKDIR/outext-$name.TMP
		done

		# Add this provider to the list of enabled outbound providers.
		if [ -z "$outbound_providers" ] ; then
			outbound_providers="$name"
		else
			outbound_providers="$outbound_providers $name"
		fi
	fi

	rm -f $WORKDIR/sip_peer.tmp
	rm -f $WORKDIR/sip_reg.tmp
}

# For all local users enabled for outbound calls, creates a context
# containing the extensions for Google and SIP accounts this user is
# allowed to use.
pbx_create_user_contexts()
{
	local providers

	for u in $localusers_can_dial ; do
		sed "s/|DEFAULTUSER|/$u/g" $TMPL_EXTUSERCNTXTHDR                >> $WORKDIR/userext.TMP
		cat $WORKDIR/localext.TMP                                       >> $WORKDIR/userext.TMP
		providers="`uci -q get ${MODULENAME}-calls.providers_user_can_use.$u`"
		[ -z "$providers" ] && providers="$outbound_providers"

		# For each provider, cat the contents of outext-$name.TMP into the user's outgoing calls extension
		for p in $providers ; do
			[ -f $WORKDIR/outext-$p.TMP ] && cat $WORKDIR/outext-$p.TMP >> $WORKDIR/userext.TMP
		done
		cat $TMPL_EXTUSERCNTXTFTR                                       >> $WORKDIR/userext.TMP
	done
}

# Creates the blacklist context which hangs up on blacklisted numbers.
pbx_add_blacklist()
{
	local blacklist1
	local blacklist2

	config_get blacklist1 blacklisting blacklist1
	config_get blacklist2 blacklisting blacklist2

	# We create the blacklist context no matter whether the blacklist
	# actually contains entries or not, since the PBX will send calls
	# to the context for a check against the list anyway.
	cp $TMPL_EXTBLKLISTHDR                                   $WORKDIR/blacklist.TMP
	for n in $blacklist1 $blacklist2 ; do
		sed "s/|BLACKLISTITEM|/$n/g" $TMPL_EXTBLKLIST >> $WORKDIR/blacklist.TMP 
	done
	cat $TMPL_EXTBLKLISTFTR                               >> $WORKDIR/blacklist.TMP
}

# Creates the callthrough context which allows specified numbers to get
# into the PBX and dial out as the configured user.
pbx_add_callthrough()
{
	local callthrough_number_list
	local defaultuser
	local pin
	local enabled

	config_get callthrough_number_list $1 callthrough_number_list
	config_get defaultuser $1 defaultuser
	config_get pin $1 pin
	config_get enabled $1 enabled

	[ "$enabled" = "no" ]   && return
	[ "$defaultuser" = "" ] && return

	for callthrough_number in $callthrough_number_list ; do
		sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRUCHECK >> $WORKDIR/callthroughcheck.TMP

		sed "s/|NUMBER|/$callthrough_number/g" $TMPL_EXTCTHRU |\
		    sed "s/|DEFAULTUSER|/$defaultuser/"               |\
		        sed "s/|PIN|/$pin/"                                >> $WORKDIR/callthrough.TMP
	done
}

# Creates sip.conf from its template.
pbx_cook_sip_template()
{
	local useragent
	local externhost
	local bindport

	config_get useragent advanced useragent
	config_get externhost advanced externhost
	config_get bindport advanced bindport

	[ -z "$useragent" ] && useragent="$USERAGENT"

	sed "s/|USERAGENT|/$useragent/g" $TMPL_SIP  > $WORKDIR/sip.conf

	if [ -z "$externhost" ] ; then
		sed -i "s/externhost=|EXTERNHOST|//g" $WORKDIR/sip.conf
	else
		sed -i "s/|EXTERNHOST|/$externhost/g" $WORKDIR/sip.conf
	fi

	if [ -z "$bindport" ] ; then
		sed -i "s/bindport=|BINDPORT|//g"     $WORKDIR/sip.conf
	else
		sed -i "s/|BINDPORT|/$bindport/g"     $WORKDIR/sip.conf
	fi


}

# Creates rtp.conf from its template.
pbx_cook_rtp_template()
{
	local rtpstart
	local rtpend

	config_get rtpstart advanced rtpstart
	config_get rtpend   advanced rtpend

	sed "s/|RTPSTART|/$rtpstart/" $TMPL_RTP |\
	    sed "s/|RTPEND|/$rtpend/"               > $WORKDIR/rtp.conf
}

# Makes sure the ownership of specified directories is proper.
pbx_fix_ownership()
{
	chown $ASTUSER:$ASTGROUP    $ASTDIRS
	chown $ASTUSER:$ASTGROUP -R $ASTDIRSRECURSIVE
}

# Creates firewall configuration. However, since this functionality is now
# taken over by pbx-advanced.lua, this function is unused.
create_firewall_config()
{
	local bindport
	local rtpstart
	local rtpend
	local externhost

	config_get bindport advanced bindport
	config_get externhost advanced externhost
	config_get rtpstart advanced rtpstart
	config_get rtpend   advanced rtpend

	# We need all of these parameters to be set in order to consider inserting firewall rules.
	if [ -z "$externhost" -o -z "$bindport" -o -z "$rtpstart" -o -z "$rtpend" ] ; then
		rm -f $FIREWALL_PATH
		return
	fi

	sed "s/|SIPPORT|/$bindport/g" $TMPL_FIREWALL |\
	     sed "s/|RTPRANGE|/$rtpstart:$rtpend/g" > $WORKDIR/firewall.$MODULENAME

	# Make sure there is an include section in the firewall configuration
	# to include the file we just created.
	i=0 ; found_path=0
	while p=`uci get firewall.@include[$i].path 2>/dev/null` ; do
		if [ "$p" = "$FIREWALL_PATH" ] ; then
			found_path=1
			break
		fi
		i=`expr $i + 1`
	done

	# If no include section was found which mentions $FIREWALL_PATH, add one.
	if [ $found_path -eq 0 ] ; then
		uci add firewall include   1>/dev/null 2>/dev/null
		uci set firewall.@include[-1].path="$FIREWALL_PATH"
		uci commit firewall
	fi
}

start() {
	mkdir -p $WORKDIR

	# Create the users.
	config_load ${MODULENAME}-users
	config_foreach pbx_add_user local_user

	# Create configuration for each google account.
	config_unset
	config_load ${MODULENAME}-google
	config_foreach pbx_add_jabber gtalk_jabber

	# Create configuration for each voip provider.
	config_unset
	config_load ${MODULENAME}-voip
	config_foreach pbx_add_peer voip_provider

	# Create the user contexts, and phone blacklist.
	config_unset
	config_load ${MODULENAME}-calls
	pbx_create_user_contexts
	pbx_add_blacklist
	config_foreach pbx_add_callthrough callthrough_numbers

	# Prepare sip.conf using settings from the "advanced" section.
	config_unset
	config_load ${MODULENAME}-advanced
	pbx_cook_sip_template
	pbx_cook_rtp_template

	# Assemble the configuration, and copy changed files over.
	pbx_assemble_and_copy_config

	# Enforce ownership of specified files and directories.
	pbx_fix_ownership
}

